package gold.gold01;

/**
 * 注意这种, 旋转的题, 或者是连成一个环的题, 经常是数据结构*2而不是把原来的数据首位拼接起来
 * 注意这里的StringBuilder的使用
 */
public class S0109字符串轮转 {
    /**
     * 19, 27
     * 就用双指针吧, 逐个比较字符, 会比每次创建一次子串来比较更加合适吧, 用SB
     */
    public boolean isFlipedString2(String s1, String s2) {
        if(s1 == null || s2 == null || s1.length() != s2.length()) return false;
        if(s1.length() == 0 || s1.equals(s2)) return true;
        int len = s1.length();
        StringBuilder sb1 = new StringBuilder(s1);
        StringBuilder sb2 = new StringBuilder(s2);
        for(int i = 0; i < len; i ++){
            if(sb1.charAt(i) == sb2.charAt(0)){
                // s1中找到了和s2第一个值相同的点, 如果从这个点开始直到s1的最后全都在s2中才行
                for(int j = i; j < len; j++){
                    // 这个break的判断条件可以直接移到for循环里面, 这个是从class文件中发现的
                    if(sb1.charAt(j) != sb2.charAt(j - i)) break;
                    if(j == len - 1){
                        // 这个点到最后都在s2中, 于是检查一下剩下的半段
                        if(sb1.substring(0, i).equals(sb2.substring(len -i, len))) return true;
                    }
                }
            }
        }
        return false;
    }
    // 直接比较子串 34, 5 反而更快, 妈的, 绝了。其实和最优仅有1ms之遥。
    public boolean isFlipedString(String s1, String s2) {
        if(s1 == null || s2 == null || s1.length() != s2.length()) return false;
        if(s1.length() == 0 || s1.equals(s2)) return true;
        int len = s1.length();
        StringBuilder sb1 = new StringBuilder(s1), sb2 = new StringBuilder(s2);
        for(int i = 0; i < len; i ++){
            if(sb1.charAt(i) == sb2.charAt(0)){
                // 把上面这个if也移下来更好看, 反正是短路与
                // s1中找到了和s2第一个值相同的点, 如果从这个点开始直到s1的最后全都在s2中才行
                if(sb1.substring(i, len).equals(sb2.substring(0, len - i)) && sb1.substring(0, i).equals(sb2.substring(len - i, len))) return true;
            }
        }
        return false;
    }
    // 妈的, 绝了。
    // 注意这里的s1.contaions()方法, 底层也是遍历的
    public boolean isFlipedString3(String s1, String s2) {
        if(s1.length() != s2.length()){
            return false;
        }
        s1 += s1;
        return s1.contains(s2);
    }
}
